home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 292_03 / m00mch.c < prev    next >
C/C++ Source or Header  |  1990-07-16  |  3KB  |  238 lines

  1. /* m00mch.c */
  2.  
  3. /*
  4.  * (C) Copyright 1989,1990
  5.  * All Rights Reserved
  6.  *
  7.  * Alan R. Baldwin
  8.  * 721 Berkeley St.
  9.  * Kent, Ohio  44240
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <setjmp.h>
  14. #include "asm.h"
  15. #include "m6800.h"
  16.  
  17. /*
  18.  * Process a machine op.
  19.  */
  20. VOID
  21. machine(mp)
  22. struct mne *mp;
  23. {
  24.     register op, t1;
  25.     struct expr e1;
  26.     struct area *espa;
  27.     char id[NCPS];
  28.     int c, v1, reg;
  29.  
  30.     reg = 0;
  31.     op = mp->m_valu;
  32.     switch (mp->m_type) {
  33.  
  34.     case S_SDP:
  35.         e1.e_mode = 0;
  36.         e1.e_flag = 0;
  37.         e1.e_addr = 0;
  38.         e1.e_base.e_ap = NULL;
  39.         espa = NULL;
  40.         if (more()) {
  41.             expr(&e1, 0);
  42.             if (e1.e_flag == 0 && e1.e_base.e_ap == NULL) {
  43.                 if (e1.e_addr) {
  44.                     err('b');
  45.                 }
  46.             }
  47.             if ((c = getnb()) == ',') {
  48.                 getid(id, -1);
  49.                 espa = alookup(id);
  50.                 if (espa == NULL) {
  51.                     err('u');
  52.                 }
  53.             } else {
  54.                 unget(c);
  55.             }
  56.         }
  57.         if (espa) {
  58.             outdp(espa, &e1);
  59.         } else {
  60.             outdp(dot.s_area, &e1);
  61.         }
  62.         lmode = SLIST;
  63.         break;
  64.  
  65.     case S_INH:
  66.         outab(op);
  67.         break;
  68.  
  69.     case S_PUL:
  70.         v1 = admode(abx);
  71.         if (v1 == S_A) {
  72.             outab(op);
  73.             break;
  74.         }
  75.         if (v1 == S_B) {
  76.             outab(op+1);
  77.             break;
  78.         }
  79.         aerr();
  80.         break;
  81.  
  82.     case S_BRA:
  83.         expr(&e1, 0);
  84.         outab(op);
  85.         if (e1.e_base.e_ap == NULL || e1.e_base.e_ap == dot.s_area) {
  86.             v1 = e1.e_addr - dot.s_addr - 1;
  87.             if ((v1 < -128) || (v1 > 127))
  88.                 aerr();
  89.             outab(v1);
  90.         } else {
  91.             outrb(&e1, R_PCR);
  92.         }
  93.         if (e1.e_mode != S_USER)
  94.             rerr();
  95.         break;
  96.  
  97.     case S_TYP1:
  98.         t1 = addr(&e1);
  99.         if (t1 == S_A) {
  100.             outab(op|A);
  101.             break;
  102.         }
  103.         if (t1 == S_B) {
  104.             outab(op|B);
  105.             break;
  106.         }
  107.         if (t1 == S_DIR) {
  108.             outab(op|0x30);
  109.             outrw(&e1, 0);
  110.             aerr();
  111.             break;
  112.         }
  113.         if (t1 == S_EXT) {
  114.             outab(op|0x30);
  115.             outrw(&e1, 0);
  116.             break;
  117.         }
  118.         if (t1 == S_INDX) {
  119.             outab(op|X);
  120.             outrb(&e1, R_USGN);
  121.             break;
  122.         }
  123.         aerr();
  124.         break;
  125.  
  126.     case S_TYP2:
  127.         if ((reg = admode(abx)) == 0)
  128.             aerr();
  129.  
  130.     case S_TYP3:
  131.         if (!reg) {
  132.             reg = op & 0x40;
  133.         } else if (reg == S_A) {
  134.             reg = 0x00;
  135.         } else if (reg == S_B) {
  136.             reg = 0x40;
  137.         } else {
  138.             aerr();
  139.             reg = 0x00;
  140.         }
  141.         t1 = addr(&e1);
  142.         if (t1 == S_IMMED) {
  143.             if ((op|0x40) == 0xC7)
  144.                 aerr();
  145.             outab(op|reg);
  146.             outrb(&e1, 0);
  147.             break;
  148.         }
  149.         if (t1 == S_EXT) {
  150.             outab(op|reg|0x30);
  151.             outrw(&e1, 0);
  152.             break;
  153.         }
  154.         if (t1 == S_DIR) {
  155.             outab(op|reg|0x10);
  156.             outrb(&e1, R_PAG0);
  157.             break;
  158.         }
  159.         if (t1 == S_INDX) {
  160.             outab(op|reg|0x20);
  161.             outrb(&e1, R_USGN);
  162.             break;
  163.         }
  164.         aerr();
  165.         break;
  166.  
  167.     case S_TYP4:
  168.         t1 = addr(&e1);
  169.         if (t1 == S_IMMED) {
  170.             if (op&0x0D == 0x0D)
  171.                 aerr();
  172.             outab(op);
  173.             outrw(&e1, 0);
  174.             break;
  175.         }
  176.         if (t1 == S_EXT) {
  177.             outab(op|0x30);
  178.             outrw(&e1, 0);
  179.             break;
  180.         }
  181.         if (t1 == S_DIR) {
  182.             outab(op|0x10);
  183.             outrb(&e1, R_PAG0);
  184.             break;
  185.         }
  186.         if (t1 == S_INDX) {
  187.             outab(op|0x20);
  188.             outrb(&e1, R_USGN);
  189.             break;
  190.         }
  191.         aerr();
  192.         break;
  193.  
  194.     case S_TYP5:
  195.         t1 = addr(&e1);
  196.         if (t1 == S_DIR) {
  197.             outab(op|0x10);
  198.             outrw(&e1, 0);
  199.             aerr();
  200.             break;
  201.         }
  202.         if (t1 == S_EXT) {
  203.             outab(op|0x10);
  204.             outrw(&e1, 0);
  205.             break;
  206.         }
  207.         if (t1 == S_INDX) {
  208.             outab(op);
  209.             outrb(&e1, R_USGN);
  210.             break;
  211.         }
  212.         aerr();
  213.         break;
  214.  
  215.     default:
  216.         err('o');
  217.     }
  218. }
  219.  
  220. /*
  221.  * The next character must be a
  222.  * comma.
  223.  */
  224. VOID
  225. comma()
  226. {
  227.     if (getnb() != ',')
  228.         qerr();
  229. }
  230.  
  231. /*
  232.  * Machine dependent initialization
  233.  */
  234. VOID
  235. minit()
  236. {
  237. }
  238.